#ifndef __DOUBLELINKLIST_H_
#define __DOUBLELINKLIST_H_
#include <stddef.h>

class DoubleLinkList
{
public:
    using ElementType = void *;
    DoubleLinkList();
    DoubleLinkList(const DoubleLinkList &list);
    DoubleLinkList &operator=(const DoubleLinkList &list);
    // 拷贝构造  赋值运算符重载
    ~DoubleLinkList();
    void InsertTail(const ElementType &element);
    void InsertByIndex(size_t index, const ElementType &element);

    size_t Size()
    {
        return size;
    }
    
    void SetFreeFunc(void (*Free)(ElementType))
    {
        this->Free = Free;
    }

    void SetPrintFunc(void (*Print)(ElementType))
    {
        this->Print = Print;
    }

    void SetComprFunc(int (*Compr)(ElementType, ElementType))
    {
        this->Compr = Compr;
    }

    void SetComprFunc(bool (*AllCompre)(ElementType, ElementType))
    {
        this->AllCompr = AllCompr;
    }

    // 删除
    // 按位置删除
    void RemoveByIndex(size_t index);
    // 按值删除
    void RemoveByElement(const ElementType &element);

    // 按位置查找
    ElementType *FindByIndex(size_t index); // 返回数据域 返回指针，可以判断非法
    // 按值查找
    DoubleLinkList FindByElement(const ElementType &element); // 返回数据域的指针集合

    // 修改
    // 按位置修改
    void UpdateByIndex(size_t index, const ElementType &element);
    // 按值修改
    void UpdateByElement(const ElementType &oldValue, const ElementType &newValue);

    // 排序 快速排序
    void BubbleSort();
    void Sort();

    void show();

private:
    struct Node
    {
        Node(const ElementType &value)
        {
            this->value = value;
            next = prev = nullptr;
        }
        ElementType value;
        Node *next; // 后驱指针
        Node *prev; // 前驱指针
    };
    void FastSort(Node *start, Node *end);
    Node *head;
    Node *tail;
    size_t size;

    void (*Free)(ElementType);              // 释放对象的函数指针
    int (*Compr)(ElementType, ElementType); // 比较大小的指针
    bool (*AllCompr)(ElementType, ElementType);
    void (*Print)(ElementType); // 打印
};

#endif
